package thread;

/**
 * 静态方法上如果使用了synchronized，那么该方法一定具有同步效果。
 */
public class SyncDemo3 {
    public static void main(String[] args) {
        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Thread t1 = new Thread(){
            public void run(){
                f1.dosome();//静态方法应当:类名.方法() Foo.dosome()
            }
        };
        Thread t2 = new Thread(){
            public void run(){
                f2.dosome();
            }
        };
        t1.start();
        t2.start();
    }
}
class Foo{
    /*
        如果这里将static去掉会如何?
        此时dosome变成一个成员方法，因此synchronized对应的锁对象就是this。
        那么上面两个线程t1和t2调用时由于:
        t1调用的是f1.dosome()，那么dosome中的this就是f1
        t2调用的是f2.dosome()，那么dosome中的this就是f2
        由于两个线程看到的并非同一个锁对象，因此可以同时执行该该方法。

        static方法则不同，由于该方法全局唯一，因此无论什么时候以何种方式调用
        都能做到同步效果(多个线程分开执行)。
        静态方法上使用synchronized后锁对象为当前类的类对象(Class的实例)
        JVM中每个被加载的类都有且只有一个Class实例与之对应，类对象会在后续反射
        知识点说明。
        在静态方法中如果使用同步块时，指定锁对象通常也用该对象，那么引用类对象的
        格式可以为:类名.class

     */
//    public synchronized static void dosome(){
    public static void dosome(){
        synchronized (Foo.class) {
            try {
                Thread t = Thread.currentThread();
                System.out.println(t.getName() + ":正在执行dosome方法...");
                Thread.sleep(5000);
                System.out.println(t.getName() + ":执行dosome方法完毕!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}





